import { ref } from "vue";

// import { getToken } from '@/utils/authToken' // 与后端的协商，websocket请求需要带上token参数

const websock: any = ref();
let messageCallback: any = ref();
let errorCallback: any = ref();
let wsUrl: any = ref("");

// 接收ws后端返回的数据
function websocketonmessage(e: any) {
  messageCallback(JSON.parse(e.data));
}

/**
 * 发起websocket连接
 * @param {Object} agentData 需要向后台传递的参数数据
 */
function websocketSend(agentData: any) {
  // 加延迟是为了尽量让ws连接状态变为OPEN
  setTimeout(() => {
    // 添加状态判断，当为OPEN时，发送消息
    if (websock.value.readyState === websock.value.OPEN) {
      // websock.OPEN = 1
      // 发给后端的数据需要字符串化
      websock.value.send(JSON.stringify(agentData));
    }
    if (websock.value.readyState === websock.value.CLOSED) {
      // websock.CLOSED = 3
      errorCallback();
    }
  }, 500);
}

// 关闭ws连接
function websocketclose(e: any) {
  // e.code === 1000  表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
  // e.code !== 1000  表示非正常关闭。
  console.log(e);
  if (e && e.code !== 1000) {
    // this.$log.error('ws连接异常，请稍候重试')
    errorCallback();
    // // 如果需要设置异常重连则可替换为下面的代码，自行进行测试
    // if (tryTime < 10) {
    //   setTimeout(function() {
    //    websock = null
    //    tryTime++
    //    initWebSocket()
    //    console.log(`第${tryTime}次重连`)
    //  }, 3 * 1000)
    // } else {
    //  Message.error('重连失败！请稍后重试')
    // }
  }
}
// 建立ws连接
function websocketOpen(e: any) {
  console.log("ws连接成功");
}

// 初始化weosocket
function initWebSocket() {
  if (typeof WebSocket === "undefined") {
    // this.$log.error('您的浏览器不支持WebSocket，无法获取数据')
    return false;
  }

  // const token = 'JWT=' + getToken()
  // ws请求完整地址
  // const requstWsUrl = wsUrl + '?' + token
  const requstWsUrl: any = wsUrl;
  websock.value = new WebSocket(requstWsUrl);

  websock.value.onmessage = function (e: any) {
    websocketonmessage(e);
  };
  websock.value.onopen = function () {
    websocketOpen(null);
  };
  websock.value.onerror = function () {
    // this.$log.error('ws连接异常，请稍候重试')
    errorCallback();
  };
  websock.value.onclose = function (e: any) {
    websocketclose(e);
  };
}

/**
 * 发起websocket请求函数
 * @param {string} url ws连接地址
 * @param {Object} agentData 传给后台的参数
 * @param {function} successCallback 接收到ws数据，对数据进行处理的回调函数
 * @param {function} errCallback ws连接错误的回调函数
 */
export function sendWebsocket(url: string, agentData: any, successCallback: any, errCallback: any) {
  wsUrl = url;
  initWebSocket();
  messageCallback = successCallback;
  errorCallback = errCallback;
  websocketSend(agentData);
}

/**
 * 关闭websocket函数
 */
export function closeWebsocket() {
  if (websock.value) {
    websock.value.close(); // 关闭websocket
    websock.value.onclose(); // 关闭websocket
  }
}
